iT邦幫忙

2023 iThome 鐵人賽

DAY 15
1
自我挑戰組

Python Discord Bot(DC機器人)系列 第 15

Python Discord Bot#15 - UI篇-Select選單

  • 分享至 

  • xImage
  •  

Select篇

參考讀物: 官方

class SelectView(discord.ui.View):
    def __init__(self, *, timeout=180):
            super().__init__(timeout=timeout)
    @discord.ui.select(placeholder="選擇", min_values=1, max_values=1, options=[
        discord.SelectOption(label="A", description="說明a"),
        discord.SelectOption(label="B", description="說明b"),
        discord.SelectOption(label="C", description="說明c"),
    ])
    async def select_callback(self, select, interation):
        await interation.response.send_message(f"收到你的選擇{select.values[0]}")
        
@Bot.command(name="選單")
async def click_click(ctx):
    await ctx.send('選單題目', view=SelectView())

結果:
https://ithelp.ithome.com.tw/upload/images/20230915/201060718DprGNllbl.png
https://ithelp.ithome.com.tw/upload/images/20230915/20106071a7BlHk1l9W.png
https://ithelp.ithome.com.tw/upload/images/20230915/20106071pEeXt2MHhS.png


此與前篇相同,
使用 discord.ext.commands 註冊了 command
並在回傳時,原本

await ctx.send("回傳的文字")

變成了...

await ctx.send("回傳的文字", view=你宣告的discord.ui.view)

並且,discord.ui.view
使用 class 宣告內容

真正的選單主體 @discord.ui.select

參數 內容
select_type 創建的選擇類型
custom_id 選擇選單ID。
placeholder 未選擇任何內容時顯示的文字
min_values 此選擇選單最少選擇的數量1~25
max_values 此選擇選單最多選擇的數量1~25
options 選項列表 (List[discord.SelectOption])
channel_types 可以在此菜單中選擇的頻道類型列表
disabled 是否禁用
row 按鈕所屬相對行數,DC組件最多五行

@discord.SelectOption

參數 內容
label 向用戶顯示的值
value 不會向用戶顯示的值
description 附加說明
default 是否默認選擇此選項
emoji 符號

callback 回傳 interaction

使用過後的禁用

在按下按鈕後,不想讓按鈕再有作用時,在@discord.ui.select callback 宣告
並在回傳結果時,把更改的參數再回傳回去顯示

class ButtonView(discord.ui.View):
    @discord.ui.select(placeholder = "選擇", min_values=1, max_values=1, options=[
            discord.SelectOption(label="A", description="讓他告訴你未來一年間發生的事"),
            discord.SelectOption(label="B", description="讓他告訴你明天發生的事"),
            discord.SelectOption(label="C", description="讓他什麼都不要說")
        ])
        async def select_callback(self, select:discord.ui.Select, interaction:discord.Interaction):
            select.disabled = True
            msg = None
            if select.values[0] is "A": msg = "你的外表看起來隨和、好相處,但內裡其實有點固執,意志非常的堅強,面對自己在乎的事情會非常執著。"
            elif select.values[0] is "B": msg = "你的個性有點急躁,想到什麼就做什麼,但也非常的單純,從來不記仇,社交能力很強,是大家的開心果。"
            else : msg = "你總是非常的小心謹慎,個性有點內向,不太懂得如何表達自己的情感面,很多時候你更喜歡自己待著,會讓你感到相較自在。"
            await interaction.response.edit_message(content=msg ,view=None)

https://ithelp.ithome.com.tw/upload/images/20230915/20106071WGLEdfLcbA.png
https://ithelp.ithome.com.tw/upload/images/20230915/20106071jpaW2vmKVn.png
https://ithelp.ithome.com.tw/upload/images/20230915/20106071vxl3ja2HVt.png


上一篇
Python Discord Bot#14 - UI篇-Button
下一篇
Python Discord Bot#16 - UI篇-Modal Dialogs對話框
系列文
Python Discord Bot(DC機器人)31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Matsumimusu
iT邦新手 5 級 ‧ 2024-04-16 12:49:05

我是google "interaction.response.edit_message" 時查到這篇來的

我想請問一下如何編輯訊息
我看內文的示範代碼好像跟我看的api也沒不一樣
但就是執行失敗
一直都是卡在無法編輯,我想請問一下我是哪裡誤會了嗎?

代碼:

prefix = "d-"
commandname = (f'{prefix}name')
@app_commands.command(name = commandname, description = 'description')
async def name(self,interaction:discord.Integration):  
    await interaction.response.send_message("123")
    print("1")
    await asyncio.sleep(1)
    print("2")
    await interaction.response.edit_message(content="1234")
    print("3")
################### 回 傳 結 果 ###################
#O 有print"1"
#O 有回復"123"
#O 有print"2"
#X 沒有將回復編輯為"1234"
#X 沒有prine"3"

不曉得現在你還需不需要
interaction.response只能被進行一次操作
之後要使用interaction.followup
followup本質上是一個webhook,可以去翻文檔查看webhook的操左方法

我要留言

立即登入留言